package main

import (
	"context"
	"image-sever-grpc/image-web-server/config"
	"image-sever-grpc/image-web-server/db"
	router "image-sever-grpc/image-web-server/routers"
	"log"
	"net/http"
	"os"
	"os/signal"
	"syscall"
	"time"
)

func main() {
	// 1. 初始化配置-自动初始化OSS客户端，image-web-server需要
	if err := config.InitConfig(); err != nil {
		log.Fatalf("初始化配置失败: %v", err)
	}

	// 3. 初始化数据库
	if err := db.InitDB(); err != nil {
		log.Fatalf("数据库初始化失败: %v", err)
	}
	defer db.CloseDB() // 程序退出时关闭数据库连接

	// 4. 初始化路由
	r := router.InitRouter()

	// 5. 创建HTTP服务器
	server := &http.Server{
		Addr:    ":" + config.ServerPort, // 从配置获取端口（默认8081）
		Handler: r,
	}

	// 6. 启动服务器（非阻塞）
	go func() {
		log.Printf("image-web-server 启动成功，监听端口: %s\n", config.ServerPort)
		// 启动HTTP服务，若失败则退出（排除正常关闭的ErrServerClosed）
		if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("服务器启动失败: %v", err)
		}
	}()

	// 7. 优雅退出处理（监听系统中断信号）
	quit := make(chan os.Signal, 1)
	// 监听Ctrl+C（SIGINT）和终止信号（SIGTERM）
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
	<-quit // 阻塞等待中断信号

	// 收到退出信号后，优雅关闭服务器
	log.Println("开始关闭服务器...")
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	// 关闭HTTP服务器（会优雅关闭所有连接）
	if err := server.Shutdown(ctx); err != nil {
		log.Fatalf("服务器关闭异常: %v", err)
	}

	log.Println("服务器已优雅关闭")
}
